有些情境,需要把某些資料儲存在手機本地,寫過存取檔案或 SharePreference,但他實際儲存在哪裡?可以查看檔案內容嗎?
開啟開發人員模式,就能用 Device Explore 存取手機裡面的檔案。例如,直接從手機抓出截圖、將檔案直接放到手機的資料夾。
而 SharePreference 的背後其實也是寫檔,今天就一併介紹檔案儲存位置了。
/data/data/[APP Package Name],這就是 APP 的資料夾。需要特別注意的是,APP 需要是 debuggable。
 
完整 Demo 專案 Github: https://github.com/dreambo4/Restful-Api-Demo-Todo-Project
首先我們先測試寫入 SharePreference
class MainActivity : BaseActivity<ActivityMainBinding>() {
    // SharePreference 物件
    private val sharedPreferences: SharedPreferences by lazy {
        getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val defaultBaseUrl = "http://192.168.0.12:8080/"
        
        // 取得已儲存的 SharePreference
        var newBaseUrl = sharedPreferences.getString("base_url", defaultBaseUrl) ?: defaultBaseUrl
        
        sharedPreferences.edit().putString("base_url", newBaseUrl).apply()
        
        binding.apply {
            etBaseUrl.setText(newBaseUrl)
            etBaseUrl.addTextChangedListener(object : TextWatcher {
                override fun afterTextChanged(s: Editable?) {
                    newBaseUrl = s.toString()
                    // 使用者編輯過的話,就儲存 SharePreference
                    sharedPreferences.edit().putString("base_url", newBaseUrl).apply()
                }
                override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
                override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
            })
        }
    }
}

可以發現 SharePreference 的檔名,就是先前寫在 getSharedPreferences("app_prefs", Context.MODE_PRIVATE) 的名稱。並且也能用 key 存取 value 內容。
sharedPreferences.edit().putString("base_url", newBaseUrl)
sharedPreferences.getString("base_url", defaultBaseUrl)